é«åºŠãªPythonãããã°æè¡ãç¿åŸããè€éãªåé¡ãå¹ççã«è§£æ±ºããã³ãŒãå質ãåäžãããäžçäžã®éçºè ã®çç£æ§ãé«ããŸãã
Pythonãããã°æè¡ïŒã°ããŒãã«éçºè åãé«åºŠãªãã©ãã«ã·ã¥ãŒãã£ã³ã°
å€åã®æ¿ãããœãããŠã§ã¢éçºã®äžçã§ã¯ããã°ã®çºèŠãšè§£æ±ºã¯ããã»ã¹ã«ãããŠé¿ããããªãéšåã§ããåºæ¬çãªãããã°ã¯ã©ã®Pythonéçºè ã«ãšã£ãŠãå¿ é ã®ã¹ãã«ã§ãããè€éãªåé¡ã«åãçµã¿ãããã©ãŒãã³ã¹ãæé©åããæçµçã«ã°ããŒãã«èŠæš¡ã§å ç¢ã§ä¿¡é Œæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæäŸããããã«ã¯ãé«åºŠãªãã©ãã«ã·ã¥ãŒãã£ã³ã°æè¡ãç¿åŸããããšãäžå¯æ¬ ã§ãããã®å æ¬çãªã¬ã€ãã§ã¯ãããŸããŸãªããã¯ã°ã©ãŠã³ããæã€éçºè ããããé«ãå¹çãšç²ŸåºŠã§åé¡ã蚺æã»ä¿®æ£ã§ããããã«ããããã®ãæŽç·ŽãããPythonãããã°æŠç¥ãæ¢æ±ããŸãã
é«åºŠãªãããã°ã®éèŠæ§ãçè§£ãã
Pythonã¢ããªã±ãŒã·ã§ã³ãè€éåããããŸããŸãªç°å¢ã«å±éãããã«ã€ããŠããã°ã®æ§è³ªã¯åçŽãªæ§æãšã©ãŒãããè€éãªè«ççæ¬ é¥ã䞊è¡åŠçã®åé¡ããªãœãŒã¹ãªãŒã¯ãžãšå€åããå¯èœæ§ããããŸããé«åºŠãªãããã°ã¯ãåã«ãšã©ãŒãåŒãèµ·ãããŠããã³ãŒãè¡ãèŠã€ããã ãã§ã¯ãããŸãããããã«ã¯ãããã°ã©ã ã®å®è¡ãã¡ã¢ãªç®¡çãããã©ãŒãã³ã¹ã®ããã«ããã¯ã«é¢ããããæ·±ãçè§£ã䌎ããŸããç°å¢ã倧ããç°ãªããã¿ã€ã ãŸãŒã³ãè¶ããŠå ±åäœæ¥ãè¡ãããã°ããŒãã«ãªéçºããŒã ã«ãšã£ãŠãæšæºåããã广çãªãããã°ã¢ãããŒãã¯æãéèŠã§ãã
ãããã°ã«ãããã°ããŒãã«ãªæè
ã°ããŒãã«ãªãŠãŒã¶ãŒåãã®éçºã¯ãã¢ããªã±ãŒã·ã§ã³ã®åäœã«åœ±é¿ãäžããã倿°ã®èŠå ãèæ ®ããããšãæå³ããŸãïŒ
- ç°å¢ã«ããå·®ç°: ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒWindowsãmacOSãLinuxãã£ã¹ããªãã¥ãŒã·ã§ã³ïŒãPythonã®ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããŠããã©ã€ãã©ãªãããŒããŠã§ã¢æ§æã®éãã¯ããã¹ãŠãã°ãçºçããããé²åããããããå¯èœæ§ããããŸãã
- ããŒã¿ã®ããŒã«ã©ã€ãºãšæåãšã³ã³ãŒãã£ã³ã°: 倿§ãªæåã»ãããå°åå¥ã®ããŒã¿åœ¢åŒãæ±ãããšã¯ãé©åã«ç®¡çãããªãå Žåãäºæãã¬ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã
- ãããã¯ãŒã¯é å»¶ãšä¿¡é Œæ§: ãªã¢ãŒããµãŒãã¹ã忣ã·ã¹ãã ãšããåãããã¢ããªã±ãŒã·ã§ã³ã¯ããããã¯ãŒã¯ã®äžå®å®ãã«èµ·å ããåé¡ã®åœ±é¿ãåããããã§ãã
- 䞊è¡åŠçãšäžŠååŠç: é«ã¹ã«ãŒãããåãã«èšèšãããã¢ããªã±ãŒã·ã§ã³ã¯ããããã°ãéåžžã«å°é£ãªç«¶åç¶æ ããããããã¯ã«ééããããšããããŸãã
- ãªãœãŒã¹å¶çŽ: ã¡ã¢ãªãªãŒã¯ãCPUè² è·ã®é«ãæäœãªã©ã®ããã©ãŒãã³ã¹åé¡ã¯ãããŒããŠã§ã¢èœåãç°ãªãã·ã¹ãã ã§ç°ãªã圢ã§çŸããããšããããŸãã
广çãªé«åºŠãªãããã°æè¡ã¯ãå°ççãªå Žæãç¹å®ã®éçºèšå®ã«é¢ãããããããã®è€éãªã·ããªãªãäœç³»çã«èª¿æ»ããããã®ããŒã«ã𿹿³è«ãæäŸããŸãã
Pythonã®çµã¿èŸŒã¿ãããã¬ïŒpdbïŒã®åãæŽ»çšãã
Pythonã®æšæºã©ã€ãã©ãªã«ã¯ãpdbãšãã匷åãªã³ãã³ãã©ã€ã³ãããã¬ãå«ãŸããŠããŸããåºæ¬çãªäœ¿çšæ³ã¯ãã¬ãŒã¯ãã€ã³ããèšå®ããŠã³ãŒããã¹ãããå®è¡ããããšã§ãããé«åºŠãªãã¯ããã¯ãé§äœ¿ããããšã§ãã®ç䟡ãçºæ®ããŸãã
é«åºŠãªpdbã³ãã³ããšãã¯ããã¯
- æ¡ä»¶ä»ããã¬ãŒã¯ãã€ã³ã: ã«ãŒãã®åã€ãã¬ãŒã·ã§ã³ã§å®è¡ã忢ãã代ããã«ãç¹å®ã®æ¡ä»¶ãæºããããå Žåã«ã®ã¿ããªã¬ãŒããããã¬ãŒã¯ãã€ã³ããèšå®ã§ããŸããããã¯ãæ°ååã®ã€ãã¬ãŒã·ã§ã³ãæã€ã«ãŒãã®ãããã°ããçšã«çºçããã€ãã³ãã®ãã£ã«ã¿ãªã³ã°ã«éåžžã«åœ¹ç«ã¡ãŸãã
import pdb def process_data(items): for i, item in enumerate(items): if i == 1000: # 1000çªç®ã®ã¢ã€ãã ã§ã®ã¿ãã¬ãŒã¯ãã pdb.set_trace() # ... ã¢ã€ãã ãåŠç ... - äºåŸãããã°: ããã°ã©ã ãäºæããã¯ã©ãã·ã¥ããå Žåã
pdb.pm()ïŒãŸãã¯pdb.post_mortem(traceback_object)ïŒã䜿çšããŠãäŸå€ãçºçããæç¹ã§ãããã¬ã«å ¥ãããšãã§ããŸããããã«ãããã¯ã©ãã·ã¥æã®ããã°ã©ã ã®ç¶æ ã調æ»ã§ãããããæãéèŠãªæ å ±ãšãªãããšãå€ãã§ããimport pdb import sys try: # ... äŸå€ãçºçãããå¯èœæ§ã®ããã³ãŒã ... except Exception: import traceback traceback.print_exc() pdb.post_mortem(sys.exc_info()[2]) - ãªããžã§ã¯ããšå€æ°ã®æ€æ»: åçŽãªå€æ°ã®æ€æ»ã ãã§ãªãã
pdbã§ã¯ãªããžã§ã¯ãã®æ§é ãæ·±ãæãäžããããšãã§ããŸããpïŒprintïŒãppïŒpretty printïŒãdisplayãªã©ã®ã³ãã³ãã¯äžå¯æ¬ ã§ãããŸããwhatisã䜿çšããŠãªããžã§ã¯ãã®åã倿ããããšãã§ããŸãã - ãããã¬å
ã§ã®ã³ãŒãå®è¡:
interactã³ãã³ãã䜿çšãããšãçŸåšã®ãããã°ã³ã³ããã¹ãå ã§å¯Ÿè©±åã®Pythonã·ã§ã«ãéãããšãã§ãã仮説ããã¹ãããã倿°ãæäœãããããããã«ä»»æã®ã³ãŒããå®è¡ã§ããŸãã - æ¬çªç°å¢ã§ã®ãããã°ïŒæ³šæãå¿
èŠïŒ: ãããã¬ã®ã¢ã¿ãããå±éºãªæ¬çªç°å¢ã§ã®é倧ãªåé¡ã«å¯ŸããŠã¯ãç¹å®ã®ç¶æ
ããã°ã«èšé²ããããéžæçã«
pdbãæå¹ã«ãããããææ³ãçšããããŸãããã ããæå€§éã®æ³šæãšé©åãªå®å šçãå¿ èŠã§ãã
æ¡åŒµãããã¬ïŒipdbãpudbïŒã«ããpdbã®åŒ·å
ãããŠãŒã¶ãŒãã¬ã³ããªãŒã§æ©èœè±å¯ãªãããã°äœéšã®ããã«ã¯ãæ¡åŒµãããã¬ã®æ€èšããå§ãããŸãïŒ
ipdb: IPythonã®æ©èœãçµ±åããpdbã®æ¡åŒµçã§ãã¿ãè£å®ãã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããããåªããã€ã³ããã¹ãã¯ã·ã§ã³æ©èœãæäŸããŸããpudb: ã³ã³ãœãŒã«ããŒã¹ã®ããžã¥ã¢ã«ãããã¬ã§ããœãŒã¹ã³ãŒãã®ãã€ã©ã€ãã倿°æ€æ»ãã€ã³ãã³ãŒã«ã¹ã¿ãã¯ãã¥ãŒãªã©ã®æ©èœãåããã°ã©ãã£ã«ã«ãããã¬ã«äŒŒãçŽæçãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
ãããã®ããŒã«ã¯ãããã°ã®ã¯ãŒã¯ãããŒãå€§å¹ ã«æ¹åããè€éãªã³ãŒãããŒã¹ã®ããã²ãŒããããã°ã©ã ãããŒã®çè§£ã容æã«ããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹ã®ç¿åŸïŒéçºè ã®å°å³
ã¹ã¿ãã¯ãã¬ãŒã¹ã¯ããšã©ãŒã«è³ããŸã§ã®äžé£ã®é¢æ°åŒã³åºããçè§£ããããã®äžå¯æ¬ ãªããŒã«ã§ããé«åºŠãªãããã°ã«ã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ãèªãã ãã§ãªããããã培åºçã«è§£éããããšãå«ãŸããŸãã
è€éãªã¹ã¿ãã¯ãã¬ãŒã¹ã®è§£èª
- ãããŒã®çè§£: ã¹ã¿ãã¯ãã¬ãŒã¹ã¯ã颿°åŒã³åºããææ°ã®ãã®ïŒäžïŒããæãå€ããã®ïŒäžïŒãžãšãªã¹ãã¢ããããŸãããšã©ãŒã®çºçæºãšããã«è³ããŸã§ã®ãã¹ãç¹å®ããããšãéµãšãªããŸãã
- ãšã©ãŒç®æã®ç¹å®: ã¹ã¿ãã¯ãã¬ãŒã¹ã®æäžéšã®ãšã³ããªã¯ãéåžžãäŸå€ãçºçããæ£ç¢ºãªã³ãŒãè¡ãæã瀺ããŸãã
- ã³ã³ããã¹ãã®åæ: ãšã©ãŒã«å è¡ãã颿°åŒã³åºãã調ã¹ãŸãããããã®é¢æ°ã«æž¡ãããåŒæ°ãããŒã«ã«å€æ°ïŒãããã¬ã§å©çšå¯èœãªå ŽåïŒã¯ãããã°ã©ã ã®ç¶æ ã«é¢ããéèŠãªã³ã³ããã¹ããæäŸããŸãã
- ãµãŒãããŒãã£ã©ã€ãã©ãªã®ç¡èŠïŒå Žåã«ããïŒ: å€ãã®å Žåããšã©ãŒã¯ãµãŒãããŒãã£ã©ã€ãã©ãªå ã§çºçããå¯èœæ§ããããŸããã©ã€ãã©ãªã®åœ¹å²ãçè§£ããããšã¯éèŠã§ããããããã°ã®åŽåã¯ããã®ã©ã€ãã©ãªãšããåãããèªèº«ã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«éäžãããŸãããã
- ååž°åŒã³åºãã®ç¹å®: æ·±ãããŸãã¯ç¡éã®ååž°ã¯ãã¹ã¿ãã¯ãªãŒããŒãããŒãšã©ãŒã®äžè¬çãªåå ã§ããã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãç¹°ãè¿ããã颿°åŒã³åºãã®ãã¿ãŒã³ãæããã«ããååž°ã«ãŒãã瀺åããããšããããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹åæã匷åããããŒã«
- Pretty Printing:
richã®ãããªã©ã€ãã©ãªã¯ãè²åããããè¯ããã©ãŒãããã§ã¹ã¿ãã¯ãã¬ãŒã¹ã®å¯èªæ§ãåçã«åäžãããç¹ã«å€§ããªãã¬ãŒã¹ã®å Žåãã¹ãã£ã³ãšçè§£ã容æã«ããŸãã - ãã®ã³ã°ãã¬ãŒã ã¯ãŒã¯: é©åãªãã°ã¬ãã«ãæã€å ç¢ãªãã®ã³ã°ã¯ããšã©ãŒã«è³ããŸã§ã®ããã°ã©ã å®è¡ã®å±¥æŽèšé²ãæäŸããã¹ã¿ãã¯ãã¬ãŒã¹ã®æ å ±ãè£å®ããŸãã
ã¡ã¢ãªãããã¡ã€ãªã³ã°ãšãããã°
ã¡ã¢ãªãªãŒã¯ãéå°ãªã¡ã¢ãªæ¶è²»ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãäœäžãããäžå®å®æ§ãåŒãèµ·ããå¯èœæ§ããããŸããç¹ã«ãé·æéå®è¡ããããµãŒãã¹ããªãœãŒã¹ã«å¶çŽã®ããããã€ã¹ã«ãããã€ãããã¢ããªã±ãŒã·ã§ã³ã§ã¯æ·±å»ã§ããé«åºŠãªãããã°ã«ã¯ããã°ãã°ã¡ã¢ãªäœ¿çšéã®èª¿æ»ãå«ãŸããŸãã
ã¡ã¢ãªãªãŒã¯ã®ç¹å®
ã¡ã¢ãªãªãŒã¯ã¯ããªããžã§ã¯ããã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠãã¯ãå¿ èŠãšãããŠããªãã«ããããããããŸã åç §ãããŠããããã«ãã¬ããŒãžã³ã¬ã¯ã¿ããã®ã¡ã¢ãªãååã§ããªãå Žåã«çºçããŸããããã«ãããæéãšãšãã«ã¡ã¢ãªäœ¿çšéãåŸã ã«å¢å ããå¯èœæ§ããããŸãã
- ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«:
objgraph: ãã®ã©ã€ãã©ãªã¯ãªããžã§ã¯ãã°ã©ããèŠèŠåããã®ã«åœ¹ç«ã¡ãåç §ãµã€ã¯ã«ãçºèŠããäºæããä¿æãããŠãããªããžã§ã¯ããç¹å®ããããããŸããmemory_profiler: Pythonã³ãŒãå ã®ã¡ã¢ãªäœ¿çšéãäžè¡ãã€ç£èŠããããã®ã¢ãžã¥ãŒã«ã§ããã©ã®è¡ãæãå€ãã®ã¡ã¢ãªãæ¶è²»ããŠããããç¹å®ã§ããŸããguppyïŒãŸãã¯heapyïŒ: ããŒããæ€æ»ãããªããžã§ã¯ãã®å²ãåœãŠã远跡ããããã®åŒ·åãªããŒã«ã§ãã
ã¡ã¢ãªé¢é£åé¡ã®ãããã°
- ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã 远跡: ãªããžã§ã¯ãããã€äœæãããç Žæ£ãããã¹ãããçè§£ããŸããäžèŠã«ãªããžã§ã¯ããä¿æããªãããã«ãé©åãªå Žåã«ã¯åŒ±åç §ã䜿çšããŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åæ: Pythonã®ã¬ããŒãžã³ã¬ã¯ã¿ã¯äžè¬çã«å¹æçã§ããããã®æåãçè§£ããããšã¯åœ¹ç«ã¡ãŸããããŒã«ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãäœãããŠãããã«ã€ããŠã®æŽå¯ãæäŸã§ããŸãã
- ãªãœãŒã¹ç®¡ç: ãã¡ã€ã«ãã³ãã«ããããã¯ãŒã¯æ¥ç¶ãããŒã¿ããŒã¹æ¥ç¶ãªã©ã®ãªãœãŒã¹ãäžèŠã«ãªã£ããã
withæãæç€ºçãªã¯ãªãŒã³ã¢ããã¡ãœããã䜿çšããŠé©åã«éãããããè§£æŸãããããã«ããŸãã
äŸïŒmemory_profilerã§æœåšçãªã¡ã¢ãªãªãŒã¯ãæ€åºãã
from memory_profiler import profile
@profile
def create_large_list():
data = []
for i in range(1000000):
data.append(i * i)
return data
if __name__ == '__main__':
my_list = create_large_list()
# 'my_list'ãã°ããŒãã«ã§å代å
¥ãããã颿°ããããè¿ããå Žåã
# ä¿æã«ã€ãªããå¯èœæ§ããããŸãã
# ããè€éãªãªãŒã¯ã¯ãã¯ããŒãžã£ãã°ããŒãã«å€æ°ã§ã®æå³ããªãåç
§ãå«ã¿ãŸãã
ãã®ã¹ã¯ãªãããpython -m memory_profiler your_script.pyã§å®è¡ãããšãè¡ããšã®ã¡ã¢ãªäœ¿çšéã衚瀺ãããã©ãã§ã¡ã¢ãªãå²ãåœãŠãããŠããããç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãšãããã¡ã€ãªã³ã°
ãã°ä¿®æ£ã ãã§ãªããé«åºŠãªãããã°ã¯ãã°ãã°ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹æé©åã«ãŸã§åã³ãŸãããããã¡ã€ãªã³ã°ã¯ãã³ãŒãã®äžã§æãæéããªãœãŒã¹ãæ¶è²»ããŠããéšåã§ããããã«ããã¯ãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
Pythonã®ãããã¡ã€ãªã³ã°ããŒã«
cProfileïŒããã³profileïŒ: Pythonã®çµã¿èŸŒã¿ãããã¡ã€ã©ãcProfileã¯Cã§æžãããŠããããªãŒããŒããããå°ãªãã§ãããããã¯é¢æ°åŒã³åºãåæ°ãå®è¡æéãçŽ¯ç©æéã«é¢ããçµ±èšãæäŸããŸããline_profiler: è¡åäœã®ãããã¡ã€ãªã³ã°ãæäŸããæ¡åŒµæ©èœã§ã颿°å ã§æéãã©ãã§è²»ããããŠããããããè©³çŽ°ã«ææ¡ã§ããŸããpy-spy: Pythonããã°ã©ã çšã®ãµã³ããªã³ã°ãããã¡ã€ã©ãå®è¡äžã®Pythonããã»ã¹ã«ã³ãŒãä¿®æ£ãªãã§ã¢ã¿ããã§ããæ¬çªç°å¢ãè€éãªã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã«æé©ã§ããscalene: Pythonçšã®é«æ§èœã»é«ç²ŸåºŠã®CPUããã³ã¡ã¢ãªãããã¡ã€ã©ãCPU䜿çšçãã¡ã¢ãªå²ãåœãŠãããã«ã¯GPU䜿çšçãæ€åºã§ããŸãã
ãããã¡ã€ãªã³ã°çµæã®è§£é
- ãããã¹ãããã«çŠç¹ãåœãŠã: äžé£ãåãã«å€ãã®æéãæ¶è²»ãã颿°ãã³ãŒãè¡ãç¹å®ããŸãã
- ã³ãŒã«ã°ã©ãã®åæ: 颿°ãäºãã«ã©ã®ããã«åŒã³åºãããå®è¡ãã¹ãã©ãã§å€§å¹ ãªé å»¶ã«ã€ãªããããçè§£ããŸãã
- ã¢ã«ãŽãªãºã ã®è€éããèæ ®ãã: ãããã¡ã€ãªã³ã°ã«ãããéå¹çãªã¢ã«ãŽãªãºã ïŒäŸïŒO(n log n)ãO(n)ãå¯èœã§ããã«ããããããO(n^2)ã䜿çšããŠããïŒãããã©ãŒãã³ã¹åé¡ã®äž»ãªåå ã§ããããšããã°ãã°æããã«ãªããŸãã
- I/OããŠã³ã vs. CPUããŠã³ã: å€éšãªãœãŒã¹ãåŸ ã€ããã«é ãæäœïŒI/OããŠã³ãïŒãšãèšç®éãå€ãæäœïŒCPUããŠã³ãïŒãåºå¥ããŸããããã«ãããæé©åæŠç¥ã決ãŸããŸãã
äŸïŒcProfileã䜿çšããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãèŠã€ãã
import cProfile
import re
def slow_function():
# äœããã®äœæ¥ãã·ãã¥ã¬ãŒã
result = 0
for i in range(100000):
result += i
return result
def fast_function():
return 100
def main_logic():
data1 = slow_function()
data2 = fast_function()
# ... ãããªãããžãã¯
if __name__ == '__main__':
cProfile.run('main_logic()', 'profile_results.prof')
# çµæã衚瀺ããã«ã¯ïŒ
# python -m pstats profile_results.prof
pstatsã¢ãžã¥ãŒã«ã䜿çšããŠprofile_results.profãã¡ã€ã«ãåæããã©ã®é¢æ°ã®å®è¡ã«æãæéãããã£ããã衚瀺ã§ããŸãã
ãããã°ã®ããã®å¹æçãªãã®ã³ã°æŠç¥
ãããã¬ã¯å¯Ÿè©±çã§ãããå ç¢ãªãã®ã³ã°ã¯ã¢ããªã±ãŒã·ã§ã³ã®å®è¡å±¥æŽãæäŸããããã¯äºåŸåæããç¹ã«åæ£ã·ã¹ãã ã«ãããæéçµéã«äŒŽãæåã®çè§£ã«éåžžã«äŸ¡å€ããããŸãã
Pythonãã®ã³ã°ã®ãã¹ããã©ã¯ãã£ã¹
loggingã¢ãžã¥ãŒã«ã®äœ¿çš: Pythonã®çµã¿èŸŒã¿loggingã¢ãžã¥ãŒã«ã¯ãé«åºŠã«èšå®å¯èœã§åŒ·åã§ããè€éãªã¢ããªã±ãŒã·ã§ã³ã§ã¯åçŽãªprint()æãé¿ããŸãããã- æç¢ºãªãã°ã¬ãã«ã®å®çŸ©:
DEBUGãINFOãWARNINGãERRORãCRITICALã®ãããªã¬ãã«ãé©åã«äœ¿çšããŠã¡ãã»ãŒãžãåé¡ããŸãã - æ§é åãã®ã³ã°: é¢é£ããã¡ã¿ããŒã¿ïŒã¿ã€ã ã¹ã¿ã³ãããŠãŒã¶ãŒIDããªã¯ãšã¹ãIDãã¢ãžã¥ãŒã«åïŒãå«ãæ§é åãã©ãŒãããïŒäŸïŒJSONïŒã§ãã°ã¡ãã»ãŒãžãèšé²ããŸããããã«ããããã°ãæ©æ¢°å¯èªã«ãªããã¯ãšãªã容æã«ãªããŸãã
- æèæ å ±: ãã°ã¡ãã»ãŒãžã«é¢é£ãã倿°ã颿°åãå®è¡ã³ã³ããã¹ããå«ããŸãã
- éäžãã®ã³ã°: 忣ã·ã¹ãã ã§ã¯ããã¹ãŠã®ãµãŒãã¹ããã®ãã°ãéäžãã®ã³ã°ãã©ãããã©ãŒã ïŒäŸïŒELKã¹ã¿ãã¯ãSplunkãã¯ã©ãŠããã€ãã£ããœãªã¥ãŒã·ã§ã³ïŒã«éçŽããŸãã
- ãã°ã®ããŒããŒã·ã§ã³ãšä¿æ: éå°ãªãã£ã¹ã¯äœ¿çšãé¿ããããã«ããã°ãã¡ã€ã«ã®ãµã€ãºãšä¿ææéã管çããæŠç¥ãå®è£ ããŸãã
ã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã®ããã®ãã®ã³ã°
ã°ããŒãã«ã«ãããã€ãããã¢ããªã±ãŒã·ã§ã³ããããã°ããå ŽåïŒ
- ã¿ã€ã ãŸãŒã³ã®äžè²«æ§: ãã¹ãŠã®ãã°ããäžè²«æ§ã®ããææ§ãã®ãªãã¿ã€ã ãŸãŒã³ïŒäŸïŒUTCïŒã§ã¿ã€ã ã¹ã¿ã³ããèšé²ããããã«ããŸããããã¯ãç°ãªããµãŒããŒãå°åã«ãŸãããã€ãã³ããçžé¢ãããäžã§éèŠã§ãã
- å°ççãªã³ã³ããã¹ã: é¢é£ããå Žåãå°çæ å ±ïŒäŸïŒIPã¢ãã¬ã¹ã®å ŽæïŒããã°ã«èšé²ããŠãå°åçãªåé¡ãçè§£ããŸãã
- ããã©ãŒãã³ã¹ã¡ããªã¯ã¹: ç°ãªãå°åã®ãªã¯ãšã¹ãé å»¶ããšã©ãŒçããªãœãŒã¹äœ¿çšéã«é¢é£ããäž»èŠæ¥çžŸè©äŸ¡ææšïŒKPIïŒããã°ã«èšé²ããŸãã
é«åºŠãªãããã°ã·ããªãªãšè§£æ±ºç
䞊è¡åŠçãšãã«ãã¹ã¬ããã®ãããã°
ãã«ãã¹ã¬ããããã«ãããã»ãã·ã³ã°ã®ã¢ããªã±ãŒã·ã§ã³ã®ãããã°ã¯ãç«¶åç¶æ ããããããã¯ã®ããéåžžã«å°é£ã§ãããããã®åé¡ã®é決å®çãªæ§è³ªã®ããããããã¬ãæç¢ºãªå šäœåãæäŸããã®ã¯ãã°ãã°å°é£ã§ãã
- ã¹ã¬ãããµãã¿ã€ã¶: Pythonèªäœã«ã¯çµã¿èŸŒãŸããŠããŸããããå€éšããŒã«ãæè¡ãããŒã¿ç«¶åã®ç¹å®ã«åœ¹ç«ã€ããšããããŸãã
- ããã¯ã®ãããã°: ããã¯ãåæããªããã£ãã®äœ¿çšãæ éã«æ€æ»ããŸããããã¯ãæ£ããäžè²«ããŠååŸããã³è§£æŸãããŠããããšã確èªããŸãã
- åçŸå¯èœãªãã¹ã: 䞊è¡åŠçã·ããªãªãç¹ã«ã¿ãŒã²ããã«ããåäœãã¹ããäœæããŸããæã«ã¯ãé å»¶ã远å ãããæå³çã«ç«¶åãçºçããããããããšã§ãæãã«ãããã°ãåçŸããã®ã«åœ¹ç«ã¡ãŸãã
- ã¹ã¬ããIDã®ãã®ã³ã°: ã¡ãã»ãŒãžã«ã¹ã¬ããIDããã°èšé²ããŠãã©ã®ã¢ã¯ã·ã§ã³ãã©ã®ã¹ã¬ãããå®è¡ããŠããããåºå¥ããŸãã
threading.local(): ã¹ã¬ããããŒã«ã«ã¹ãã¬ãŒãžã䜿çšããŠãæç€ºçãªããã¯ãªãã§åã¹ã¬ããã«åºæã®ããŒã¿ã管çããŸãã
ãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãšAPIã®ãããã°
ãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã®åé¡ã¯ããã°ãã°ãããã¯ãŒã¯ã®åé¡ãå€éšãµãŒãã¹ã®é害ããŸãã¯äžæ£ãªãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹åŠçã«èµ·å ããŸãã
- Wireshark/tcpdump: ãããã¯ãŒã¯ãã±ããã¢ãã©ã€ã¶ã¯ãçã®ãããã¯ãŒã¯ãã©ãã£ãã¯ããã£ããã£ããŠæ€æ»ã§ããéåä¿¡ãããŠããããŒã¿ãçè§£ããã®ã«åœ¹ç«ã¡ãŸãã
- APIã¢ããã³ã°: ãã¹ãäžã«å€éšAPIåŒã³åºããã¢ãã¯ããããã«ã
unittest.mockã®ãããªããŒã«ãresponsesã®ãããªã©ã€ãã©ãªã䜿çšããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãåé¢ãããå€éšãµãŒãã¹ãšã®çžäºäœçšãå¶åŸ¡ãããç¶æ ã§ãã¹ãã§ããŸãã - ãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹ã®ãã®ã³ã°: éä¿¡åé¡ã蚺æããããã«ãããããŒããã€ããŒããå«ããéä¿¡ããããªã¯ãšã¹ããšåä¿¡ããã¬ã¹ãã³ã¹ã®è©³çްããã°ã«èšé²ããŸãã
- ã¿ã€ã ã¢ãŠããšãªãã©ã€: ãããã¯ãŒã¯ãªã¯ãšã¹ãã«é©åãªã¿ã€ã ã¢ãŠããå®è£ ããäžæçãªãããã¯ãŒã¯é害ã«å¯Ÿããå ç¢ãªãªãã©ã€ã¡ã«ããºã ãå®è£ ããŸãã
- çžé¢ID: 忣ã·ã¹ãã ã§ã¯ãçžé¢IDã䜿çšããŠãè€æ°ã®ãµãŒãã¹ã«ãŸãããåäžã®ãªã¯ãšã¹ãã远跡ããŸãã
å€éšäŸåé¢ä¿ãšçµ±åã®ãããã°
ã¢ããªã±ãŒã·ã§ã³ãå€éšã®ããŒã¿ããŒã¹ãã¡ãã»ãŒãžãã¥ãŒããŸãã¯ä»ã®ãµãŒãã¹ã«äŸåããŠããå Žåããããã®äŸåé¢ä¿ã®èšå®ãã¹ãäºæããªãåäœãããã°ãçºçããå¯èœæ§ããããŸãã
- äŸåé¢ä¿ã®ãã«ã¹ãã§ãã¯: ã¢ããªã±ãŒã·ã§ã³ããã®äŸåé¢ä¿ã«æ¥ç¶ããçžäºäœçšã§ããããšã確èªããããã®ãã§ãã¯ãå®è£ ããŸãã
- ããŒã¿ããŒã¹ã¯ãšãªåæ: ããŒã¿ããŒã¹åºæã®ããŒã«ã䜿çšããŠãé ãã¯ãšãªãåæããããå®è¡èšç»ãçè§£ãããããŸãã
- ã¡ãã»ãŒãžãã¥ãŒã®ç£èŠ: æªé ä¿¡ã¡ãã»ãŒãžããããã¬ã¿ãŒãã¥ãŒãåŠçé å»¶ã«ã€ããŠã¡ãã»ãŒãžãã¥ãŒãç£èŠããŸãã
- ããŒãžã§ã³ã®äºææ§: äŸåé¢ä¿ã®ããŒãžã§ã³ãã䜿çšããŠããPythonã®ããŒãžã§ã³ãä»ã®äŸåé¢ä¿ãšäºææ§ãããããšã確èªããŸãã
ãããã°ã®ãã€ã³ãã»ãããæ§ç¯ãã
ããŒã«ããã¯ããã¯ãè¶ ããŠã广çãªãããã°ã«ã¯äœç³»çã§åæçãªãã€ã³ãã»ãããé€ãããšãäžå¯æ¬ ã§ãã
- ãã°ãå®å®ããŠåçŸãã: ãã°ã解決ããããã®æåã®ã¹ãããã¯ãããã確å®ã«åçŸã§ããããã«ããããšã§ãã
- 仮説ãç«ãŠã: çç¶ã«åºã¥ããŠããã°ã®æœåšçãªåå ã«ã€ããŠæ ¹æ ã®ããæšæž¬ãç«ãŠãŸãã
- åé¡ãåãåãã: ã³ãŒããåçŽåããããã³ã³ããŒãã³ããç¡å¹ã«ããããæå°éã®åçŸå¯èœãªäŸãäœæãããããŠãåé¡ã®ç¯å²ãçµã蟌ã¿ãŸãã
- ä¿®æ£ããã¹ããã: 解決çãå ã®ãã°ã解決ããæ°ãããã°ãå°å ¥ããªãããšã確èªããããã«ã培åºçã«ãã¹ãããŸãããšããžã±ãŒã¹ãèæ ®ããŠãã ããã
- ãã°ããåŠã¶: ãã¹ãŠã®ãã°ã¯ãã³ãŒãããã®äŸåé¢ä¿ãããã³Pythonã®å éšã«ã€ããŠããã«åŠã¶æ©äŒã§ããç¹°ãè¿ãçºçããåé¡ãšãã®è§£æ±ºçãææžåããŸãã
- 广çã«ååãã: ãã°ããããã°ã®åãçµã¿ã«é¢ããæ å ±ãããŒã ãšå ±æããŸãããã¢ãããã°ã¯éåžžã«å¹æçã§ãã
çµè«
é«åºŠãªPythonãããã°ã¯ãåã«ãšã©ãŒãèŠã€ããŠä¿®æ£ããããšã ãã§ã¯ãããŸãããããã¯ãå埩åãæ§ç¯ããã¢ããªã±ãŒã·ã§ã³ã®åäœãæ·±ãçè§£ãããã®æé©ãªããã©ãŒãã³ã¹ã確ä¿ããããšã§ããé«åºŠãªãããã¬ã®äœ¿çšã培åºçãªã¹ã¿ãã¯ãã¬ãŒã¹åæãã¡ã¢ãªãããã¡ã€ãªã³ã°ãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ãæŠç¥çãªãã®ã³ã°ãªã©ã®ãã¯ããã¯ãç¿åŸããããšã§ãäžçäžã®éçºè ã¯æãè€éãªãã©ãã«ã·ã¥ãŒãã£ã³ã°ã®èª²é¡ã«ã察åŠã§ããŸãããããã®ããŒã«ã𿹿³è«ãåãå ¥ããŠãããã¯ãªãŒã³ã§ãããå ç¢ã§ãããå¹ççãªPythonã³ãŒããæžãã倿§ã§èŠæ±ã®å³ããã°ããŒãã«ãªç°å¢ã§ã¢ããªã±ãŒã·ã§ã³ãæåããããšã確å®ã«ããŸãããã